/**
 * Created by jiachenpan on 16/11/18.
 */

export function parseTime(time, cFormat) {
  if (arguments.length === 0) {
    return null
  }
  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
  let date
  if (typeof time === 'object') {
    date = time
  } else {
    if (('' + time).length === 10) time = parseInt(time) * 1000
    date = new Date(time)
  }
  const formatObj = {
    y: date.getFullYear(),
    m: date.getMonth() + 1,
    d: date.getDate(),
    h: date.getHours(),
    i: date.getMinutes(),
    s: date.getSeconds(),
    a: date.getDay()
  }
  const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
    let value = formatObj[key]
    if (key === 'a') return ['一', '二', '三', '四', '五', '六', '日'][value - 1]
    if (result.length > 0 && value < 10) {
      value = '0' + value
    }
    return value || 0
  })
  return time_str
}

export function formatTime(time, option) {
  time = +time * 1000
  const d = new Date(time)
  const now = Date.now()

  const diff = (now - d) / 1000

  if (diff < 30) {
    return '刚刚'
  } else if (diff < 3600) { // less 1 hour
    return Math.ceil(diff / 60) + '分钟前'
  } else if (diff < 3600 * 24) {
    return Math.ceil(diff / 3600) + '小时前'
  } else if (diff < 3600 * 24 * 2) {
    return '1天前'
  }
  if (option) {
    return parseTime(time, option)
  } else {
    return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分'
  }
}

export function mathCount(arr, type) {
  let sum = 0;

  for (let i = 0; i < arr.length; i++) {
    sum += arr[i];
  }

  if (type === 'sum') {
    return sum
  }

  const average = sum / arr.length;

  if (type === 'average') {
    return average
  }

  let sum2 = 0;
  let sum3 = 0;

  for (let i = 0; i < arr.length; i++) {
    sum2 += Math.pow(arr[i] - average, 2);
    sum3 += Math.abs(arr[i] - average);
  }

  const variance = sum2 / arr.length;

  if (type === 'variance') {
    return variance
  }

  const averageDeviation = sum3 / arr.length;

  if (type === 'averageDeviation') {
    return averageDeviation
  }

  const sd = Math.sqrt(variance);

  if (type === 'sd') {
    return sd;
  }

  const ratio = sd / average

  if (type === 'ratio') {
    return ratio;
  }
}

export function getPoints(gray, ratio = 25.5) {
  const arr = [];
  for (let y = 0; y < gray.rows; y++) {
    for (let x = 0; x < gray.cols; x++) {
      const pixelValue = gray.ucharAt(y, x);
      if (pixelValue >= ratio) {
        arr.push(pixelValue);
      }
    }
  }
  return arr;
}

/** 
 * 防抖
 * @param {funtion}
 * @param {number}
 * @return {undefined}
 */
export function debounce(fn, delay, _this) {
  var delay = delay || 200;
  var timer = null;
  return function() {
    const self = _this || this;
    const args = arguments;
    timer && clearTimeout(timer);
    timer = setTimeout(function() {
      timer = null;
      fn.apply(self, args);
    }, delay);
  }
}
/** 
 * 节流
 * @param {funtion}
 * @param {number}
 * @param {boolean} 是否间隔时间之后再执行
 * @return {undefined}
 */
export function throttle(fn, delay, path = false) {
  var last;
  var timer;
  var interval = delay || 200;
  return function() {
    const self = this;
    const args = arguments;
    const now = +new Date();
    if (last && now - last < delay) {
      if (path) {
        clearTimeout(timer);
        timer = setTimeout(function() {
          last = now;
          fn.apply(self, args);
        }, delay);
      }
    } else {
      last = now;
      fn.apply(self, args);
    }
  }
}
